Making a bar chart
For this first chart, let’s make a bar chart.
We’ll start by getting our data ready.
bar_chart_data <- data %>% filter(year == 2017) %>% top_n(10, n)
Now we want to make a plot.
First, let’s create a blank canvas
data %>% ggplot()

Now let’s add x and y dimensions to our canvas.
bar_chart_data %>% ggplot(aes(x = name, y = n))

Now we need to add something called a ‘geom’. This determines what
kind of chart will get added to our canvas.
bar_chart_data %>% ggplot(aes(x = name, y = n)) +
geom_col()

This is not really how we want this to look. First, let’s order the
bars by n.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = n)) +
geom_col()

That’s getting a bit better, but that color is hideous!
In R, we can use a selection of named colors, or any hex value.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = n)) +
geom_col(fill = "cadetblue", alpha = .8)

Looking better, but I don’t love the y-axis. Let’s add commas to the
tick mark labels.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = comma(n))) +
geom_col(fill = "cadetblue", alpha = .8)

Now let’s get rid of that ugly background, those axis labels, and add
a title to our chart.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = comma(n))) +
geom_col(fill = "cadetblue", alpha = .8) +
labs(title = "The 10 most common baby names in 2017", subtitle = "None of these are Heaven spelled backwards.") +
theme_minimal() +
theme(axis.title = element_blank())

We can even layer geoms.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = comma(n))) +
geom_col(fill = "cadetblue", alpha = .8) +
labs(title = "The 10 most common baby names in 2017", subtitle = "None of these are Heaven spelled backwards.", caption = "Source: Social Security Administration\nby Olga Pierce") +
theme_minimal() +
theme(axis.title = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = comma(n)), vjust = -0.5)

Some of these are characterized as male names and some as female.
What if we want to color code them?
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = comma(n), fill = sex)) +
geom_col(alpha = .8) +
labs(title = "The 10 most common baby names in 2017", subtitle = "None of these are Heaven spelled backwards.", caption = "Source: Social Security Administration\nby Olga Pierce") +
theme_minimal() +
theme(axis.title = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = comma(n)), vjust = -0.5)

Those colors are kinda problematic, let’s pick our own.
bar_chart_data %>% ggplot(aes(x = reorder(name,desc(n)), y = comma(n), fill = sex)) +
geom_col(alpha = .8) +
labs(title = "The 10 most common baby names in 2017", subtitle = "None of these are Heaven spelled backwards.", caption = "Source: Social Security Administration\nby Olga Pierce") +
theme_minimal() +
theme(axis.title = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = comma(n)), vjust = -0.5) +
scale_fill_manual(values=c("#756bb1", "#2ca25f"))

Now you try: With a buddy, make your own super awesome bar chart
Let’s make a line chart
First, we want to get the 10 girls’ names.
line_chart_data <- data %>% filter(sex == "F" & name %in% c("Olive", "Betty", "Madison", "Nevaeh", "Stephanie"))
View(line_chart_data)
Now we’ll set up our canvas
line_chart_data %>% ggplot(aes(x = year, y = prop))

And now we’ll add lines
line_chart_data %>% ggplot(aes(x = year, y = prop, color = name)) +
geom_line() +
theme_minimal()

Let’s do some cosmetic changes
line_chart_data %>% ggplot(aes(x = year, y = prop, color = name)) +
geom_line() +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(1900,2017,10)) +
theme_minimal() +
theme(axis.title = element_blank()) +
labs(title = "My awesome chart title", subtitle = "Names as a percentage of all births", color = "Baby name")

And here’s an alternative version
line_chart_data %>% ggplot(aes(x = year, y = prop, color = name, fill = name)) +
geom_density(stat = "identity", alpha = .5) +
theme_minimal()

Faceting
(Ignore this code - it’s just to prep the data)
top_names <- data %>% group_by(name) %>% summarize(total = sum(n)) %>% arrange(desc(total)) %>% top_n(20,total)
facet_names <- inner_join(data, top_names)
Joining with `by = join_by(name)`
And now the chart
facet_names %>% ggplot(aes(x = year, y = prop, color = name)) +
geom_line() +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(breaks = seq(1900,2017,40)) +
theme_minimal() +
theme(legend.position = "none") +
facet_wrap(vars(name), ncol = 5)
Your turn: With a buddy, make a rad line chart
LS0tCnRpdGxlOiAiUjI6IFZpc3VhbGl6aW5nIGRhdGEgTklDQVIgMjAyMyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogT2xnYSBQaWVyY2UKLS0tCgojIyMjIExvYWQgcGFja2FnZXMKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJhYnluYW1lcykKbGlicmFyeShzY2FsZXMpCmBgYAoKIyMjIyBMb2FkIGRhdGEKYGBge3J9CmRhdGEgPC0gYmFieW5hbWVzCmBgYAoKIyMjIFdoYXQgaXMgZ2dwbG90Mj8KClRoZSBwYWNrYWdlIGdncGxvdDIgYWxsb3dzIHVzIHRvIGNyZWF0ZSBhIG51bWJlciBvZiB2aXN1YWxpemF0aW9ucyB3aXRoIHRyZW1lbmRvdXMgZmxleGliaWxpdHkgYW5kIGN1c3RvbWl6YXRpb24uICBCZWNhdXNlIGl0IGlzIG9wZW4gc291cmNlLCBpdHMgY2FwYWJpbGl0aWVzIGFyZSBleHBhbmRlZCBhbGwgdGhlIHRpbWUgYnkgYSBjb21tdW5pdHkgYXJvdW5kIHRoZSB3b3JsZC4KCiMjIyBnZ3Bsb3QgZXhhbXBsZXMKCiFbXShpbWFnZXMvZ2dwbG90X2V4YW1wbGUucG5nKQohW10oaW1hZ2VzL2dncGxvdCBleGFtcGxlIDIucG5nKQohW10oaW1hZ2VzL2dncGxvdF9leGFtcGxlXzMucG5nKQoKIyMjIE1ha2luZyBhIGJhciBjaGFydAoKRm9yIHRoaXMgZmlyc3QgY2hhcnQsIGxldCdzIG1ha2UgYSBiYXIgY2hhcnQuCgpXZSdsbCBzdGFydCBieSBnZXR0aW5nIG91ciBkYXRhIHJlYWR5LgpgYGB7cn0KYmFyX2NoYXJ0X2RhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHllYXIgPT0gMjAxNykgJT4lIHRvcF9uKDEwLCBuKQpgYGAKCk5vdyB3ZSB3YW50IHRvIG1ha2UgYSBwbG90LgoKRmlyc3QsIGxldCdzIGNyZWF0ZSBhIGJsYW5rIGNhbnZhcwpgYGB7cn0KZGF0YSAlPiUgZ2dwbG90KCkKYGBgCgpOb3cgbGV0J3MgYWRkIHggYW5kIHkgZGltZW5zaW9ucyB0byBvdXIgY2FudmFzLgpgYGB7cn0KYmFyX2NoYXJ0X2RhdGEgJT4lIGdncGxvdChhZXMoeCA9IG5hbWUsIHkgPSBuKSkgCmBgYAoKTm93IHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZyBjYWxsZWQgYSAnZ2VvbScuIFRoaXMgZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2YgY2hhcnQgd2lsbCBnZXQgYWRkZWQgdG8gb3VyIGNhbnZhcy4KYGBge3J9CmJhcl9jaGFydF9kYXRhICU+JSBnZ3Bsb3QoYWVzKHggPSBuYW1lLCB5ID0gbikpICsKICBnZW9tX2NvbCgpCgpgYGAKClRoaXMgaXMgbm90IHJlYWxseSBob3cgd2Ugd2FudCB0aGlzIHRvIGxvb2suIEZpcnN0LCBsZXQncyBvcmRlciB0aGUgYmFycyBieSBuLgoKYGBge3J9CmJhcl9jaGFydF9kYXRhICU+JSBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKG5hbWUsZGVzYyhuKSksIHkgPSBuKSkgKwogIGdlb21fY29sKCkKYGBgCgpUaGF0J3MgZ2V0dGluZyBhIGJpdCBiZXR0ZXIsIGJ1dCB0aGF0IGNvbG9yIGlzIGhpZGVvdXMhCgpJbiBSLCB3ZSBjYW4gdXNlIGEgc2VsZWN0aW9uIG9mIG5hbWVkIGNvbG9ycywgb3IgYW55IGhleCB2YWx1ZS4KCmBgYHtyfQpiYXJfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihuYW1lLGRlc2MobikpLCB5ID0gbikpICsKICBnZW9tX2NvbChmaWxsID0gImNhZGV0Ymx1ZSIsIGFscGhhID0gLjgpCmBgYAoKTG9va2luZyBiZXR0ZXIsIGJ1dCBJIGRvbid0IGxvdmUgdGhlIHktYXhpcy4gTGV0J3MgYWRkIGNvbW1hcyB0byB0aGUgdGljayBtYXJrIGxhYmVscy4KCmBgYHtyfQpiYXJfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihuYW1lLGRlc2MobikpLCB5ID0gY29tbWEobikpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJjYWRldGJsdWUiLCBhbHBoYSA9IC44KQpgYGAKCk5vdyBsZXQncyBnZXQgcmlkIG9mIHRoYXQgdWdseSBiYWNrZ3JvdW5kLCB0aG9zZSBheGlzIGxhYmVscywgYW5kIGFkZCBhIHRpdGxlIHRvIG91ciBjaGFydC4KCmBgYHtyfQpiYXJfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihuYW1lLGRlc2MobikpLCB5ID0gY29tbWEobikpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJjYWRldGJsdWUiLCBhbHBoYSA9IC44KSArCiAgbGFicyh0aXRsZSA9ICJUaGUgMTAgbW9zdCBjb21tb24gYmFieSBuYW1lcyBpbiAyMDE3Iiwgc3VidGl0bGUgPSAiTm9uZSBvZiB0aGVzZSBhcmUgSGVhdmVuIHNwZWxsZWQgYmFja3dhcmRzLiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKV2UgY2FuIGV2ZW4gbGF5ZXIgZ2VvbXMuCgpgYGB7cn0KYmFyX2NoYXJ0X2RhdGEgJT4lIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobmFtZSxkZXNjKG4pKSwgeSA9IGNvbW1hKG4pKSkgKwogIGdlb21fY29sKGZpbGwgPSAiY2FkZXRibHVlIiwgYWxwaGEgPSAuOCkgKwogIGxhYnModGl0bGUgPSAiVGhlIDEwIG1vc3QgY29tbW9uIGJhYnkgbmFtZXMgaW4gMjAxNyIsIHN1YnRpdGxlID0gIk5vbmUgb2YgdGhlc2UgYXJlIEhlYXZlbiBzcGVsbGVkIGJhY2t3YXJkcy4iLCBjYXB0aW9uID0gIlNvdXJjZTogU29jaWFsIFNlY3VyaXR5IEFkbWluaXN0cmF0aW9uXG5ieSBPbGdhIFBpZXJjZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCmdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShuKSksIHZqdXN0ID0gLTAuNSkKYGBgCgpTb21lIG9mIHRoZXNlIGFyZSBjaGFyYWN0ZXJpemVkIGFzIG1hbGUgbmFtZXMgYW5kIHNvbWUgYXMgZmVtYWxlLiAgV2hhdCBpZiB3ZSB3YW50IHRvIGNvbG9yIGNvZGUgdGhlbT8KCmBgYHtyfQpiYXJfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihuYW1lLGRlc2MobikpLCB5ID0gY29tbWEobiksIGZpbGwgPSBzZXgpKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAuOCkgKwogIGxhYnModGl0bGUgPSAiVGhlIDEwIG1vc3QgY29tbW9uIGJhYnkgbmFtZXMgaW4gMjAxNyIsIHN1YnRpdGxlID0gIk5vbmUgb2YgdGhlc2UgYXJlIEhlYXZlbiBzcGVsbGVkIGJhY2t3YXJkcy4iLCBjYXB0aW9uID0gIlNvdXJjZTogU29jaWFsIFNlY3VyaXR5IEFkbWluaXN0cmF0aW9uXG5ieSBPbGdhIFBpZXJjZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCmdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShuKSksIHZqdXN0ID0gLTAuNSkKYGBgCgpUaG9zZSBjb2xvcnMgYXJlIGtpbmRhIHByb2JsZW1hdGljLCBsZXQncyBwaWNrIG91ciBvd24uCmBgYHtyfQpiYXJfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihuYW1lLGRlc2MobikpLCB5ID0gY29tbWEobiksIGZpbGwgPSBzZXgpKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAuOCkgKwogIGxhYnModGl0bGUgPSAiVGhlIDEwIG1vc3QgY29tbW9uIGJhYnkgbmFtZXMgaW4gMjAxNyIsIHN1YnRpdGxlID0gIk5vbmUgb2YgdGhlc2UgYXJlIEhlYXZlbiBzcGVsbGVkIGJhY2t3YXJkcy4iLCBjYXB0aW9uID0gIlNvdXJjZTogU29jaWFsIFNlY3VyaXR5IEFkbWluaXN0cmF0aW9uXG5ieSBPbGdhIFBpZXJjZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCmdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShuKSksIHZqdXN0ID0gLTAuNSkgKwpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzc1NmJiMSIsICIjMmNhMjVmIikpCmBgYApOb3cgeW91IHRyeTogV2l0aCBhIGJ1ZGR5LCBtYWtlIHlvdXIgb3duIHN1cGVyIGF3ZXNvbWUgYmFyIGNoYXJ0CmBgYHtyfQoKYGBgCgojIyMgTGV0J3MgbWFrZSBhIGxpbmUgY2hhcnQKIApGaXJzdCwgd2Ugd2FudCB0byBnZXQgdGhlIDEwIGdpcmxzJyBuYW1lcy4KYGBge3J9CmxpbmVfY2hhcnRfZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIoc2V4ID09ICJGIiAmIG5hbWUgJWluJSBjKCJPbGl2ZSIsICJCZXR0eSIsICJNYWRpc29uIiwgIk5ldmFlaCIsICJTdGVwaGFuaWUiKSkKClZpZXcobGluZV9jaGFydF9kYXRhKQpgYGAKCk5vdyB3ZSdsbCBzZXQgdXAgb3VyIGNhbnZhcwpgYGB7cn0KbGluZV9jaGFydF9kYXRhICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gcHJvcCkpCmBgYAoKQW5kIG5vdyB3ZSdsbCBhZGQgbGluZXMKYGBge3J9CmxpbmVfY2hhcnRfZGF0YSAlPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHByb3AsIGNvbG9yID0gbmFtZSkpICsKICBnZW9tX2xpbmUoKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKTGV0J3MgZG8gc29tZSBjb3NtZXRpYyBjaGFuZ2VzCmBgYHtyfQpsaW5lX2NoYXJ0X2RhdGEgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBwcm9wLCBjb2xvciA9IG5hbWUpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MDAsMjAxNywxMCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHRpdGxlID0gIk15IGF3ZXNvbWUgY2hhcnQgdGl0bGUiLCBzdWJ0aXRsZSA9ICJOYW1lcyBhcyBhIHBlcmNlbnRhZ2Ugb2YgYWxsIGJpcnRocyIsIGNvbG9yID0gIkJhYnkgbmFtZSIpCmBgYAoKQW5kIGhlcmUncyBhbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uCmBgYHtyfQpsaW5lX2NoYXJ0X2RhdGEgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBwcm9wLCBjb2xvciA9IG5hbWUsIGZpbGwgPSBuYW1lKSkgKwogIGdlb21fZGVuc2l0eShzdGF0ID0gImlkZW50aXR5IiwgYWxwaGEgPSAuNSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCiMjIyMgRmFjZXRpbmcKCihJZ25vcmUgdGhpcyBjb2RlIC0gaXQncyBqdXN0IHRvIHByZXAgdGhlIGRhdGEpCmBgYHtyfQp0b3BfbmFtZXMgPC0gZGF0YSAlPiUgZ3JvdXBfYnkobmFtZSkgJT4lIHN1bW1hcml6ZSh0b3RhbCA9IHN1bShuKSkgJT4lIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JSB0b3BfbigyMCx0b3RhbCkKCmZhY2V0X25hbWVzIDwtIGlubmVyX2pvaW4oZGF0YSwgdG9wX25hbWVzKQpgYGAKCgpBbmQgbm93IHRoZSBjaGFydApgYGB7cn0KZmFjZXRfbmFtZXMgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBwcm9wLCBjb2xvciA9IG5hbWUpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MDAsMjAxNyw0MCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGZhY2V0X3dyYXAodmFycyhuYW1lKSwgbmNvbCA9IDUpCmBgYAoKWW91ciB0dXJuOiBXaXRoIGEgYnVkZHksIG1ha2UgYSByYWQgbGluZSBjaGFydApgYGB7cn0KCmBgYAoK